package done.easy_501_600;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

/**
 * 507. Perfect Number
 * <p>
 * 对于一个 正整数，如果它和除了它自身以外的所有正因子之和相等，我们称它为“完美数”。
 * 给定一个 正整数 n， 如果他是完美数，返回 True，否则返回 False
 * case 6:
 * case 28:
 * case 496:
 * case 8128:
 * case 33550336:
 * <p>
 * 示例：
 * 输入: 28
 * 输出: True
 * 解释: 28 = 1 + 2 + 4 + 7 + 14
 * 注意:
 * 输入的数字 n 不会超过 100,000,000. (1e8)
 * <p>
 * 这道题让我们判断给定数字是否为完美数字，并给来完美数字的定义，
 * 就是一个整数等于除其自身之外的所有的因子之和。那么由于不能包含自身，
 * 所以n必定大于1。其实这道题跟之前的判断质数的题蛮类似的，都是要找因
 * 子。由于1肯定是因子，可以提前加上，那么我们找其他因子的范围是[2, sqrt(n)]。
 * 我们遍历这之间所有的数字，如果可以被n整除，那么我们把i和num/i都加上，
 * 对于n如果是平方数的话，那么我们此时相同的因子加来两次，所以我们要判断一下，
 * 如果相等，就不再加 num/i。实际上，符合要求的完美数字很少，根本就没有完全
 * 平方数，我们根本就不用担心会加两次，当然，这都是从结果分析的，为了严格按
 * 照题目的要求，还是加上判断吧。还有就是我们也可以在遍历的过程中如果累积和
 * sum大于n了，直接返回false，但是感觉加了也没咋提高运行时间，所以干脆就不
 * 加了。在循环结束后，我们首先判断num是否为1，因为题目中说了不能加包括本身
 * 的因子，然后我们再看sum是否和num相等
 * 2019-03-26 8:01 AM
 **/
@Slf4j
public class PerfectNumber {

    @SuppressWarnings("all")
    public boolean checkPerfectNumber(int num) {
        // 190326 first
        return false;
    }

    @Test
    public void test() {
        log.info("result:{}", checkPerfectNumber(6));
    }
}





























/*
public boolean checkPerfectNumber(int num) {
    int sum = 1;
    for (int i = 2; i * i <= num; ++i) {
        // 一旦发现能整除，说明 i 和 num/i 就都是因子
        // 全都都要累加到 sum 上
        if (num % i == 0) {
            sum += i + (num / i == i ? 0 : num / i);
        }
    }
    return num != 1 && sum == num;
}
*/
